/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.perutaxi.datos;

import com.perutaxi.entidades.eCliente;
import com.perutaxi.entidades.eUsuario;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 *
 * @author PeruTaxi
 */
public class dCliente implements Serializable {

    public static Date obtenerFechaActual() {
        Calendar calendario = Calendar.getInstance();
        return calendario.getTime();
    }

    public static eCliente inicializar() {
        eCliente cliente = new eCliente();
        cliente.setNombres("");
        cliente.setApPaterno("");
        cliente.setApMaterno("");
        cliente.setDni("");
        cliente.setTelefono("");
        cliente.setDireccion("");
        cliente.setEmailLaboral("");
        cliente.setEmailPersonal("");
        cliente.setSexo("");
        cliente.setImagen("");
        cliente.setUsuario(new eUsuario());
        cliente.setNroRecTotal(0L);
        cliente.setNroRecAceptados(0L);
        cliente.setNroRecDenegados(0L);
        cliente.setNroServicios(0L);
        cliente.setFechaRegistro(new Timestamp(obtenerFechaActual().getTime()));
        cliente.setEstado(Boolean.TRUE);

        return cliente;
    }

    public static List<eCliente> obtenerActivos() throws Exception {
        List<eCliente> lista = new ArrayList<eCliente>();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM CLIENTE WHERE ESTADO = " + 1;
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                eCliente cliente = new eCliente();
                cliente.setId(rs.getLong(1));
                cliente.setNombres(rs.getString(2));
                cliente.setApPaterno(rs.getString(3));
                cliente.setApMaterno(rs.getString(4));
                cliente.setDni(rs.getString(5));
                cliente.setTelefono(rs.getString(6));
                cliente.setDireccion(rs.getString(7));
                cliente.setEmailLaboral(rs.getString(8));
                cliente.setEmailPersonal(rs.getString(9));
                cliente.setSexo(rs.getString(10));
                cliente.setFechaNacimiento(rs.getTimestamp(11));
                cliente.setImagen(rs.getString(12));
                cliente.setUsuario(dUsuario.obtenerPorId(rs.getLong(13)));
                cliente.setNroRecTotal(rs.getLong(14));
                cliente.setNroRecAceptados(rs.getLong(15));
                cliente.setNroRecDenegados(rs.getLong(16));
                cliente.setNroServicios(rs.getLong(17));
                cliente.setFechaRegistro(rs.getTimestamp(18));
                cliente.setEstado(rs.getBoolean(19));
                lista.add(cliente);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }
        
        return lista;
    }

    public static eCliente obtenerPorId(Long id) throws Exception {
        eCliente cliente = new eCliente();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM CLIENTE WHERE ID = " + id;
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getLong(1));
                cliente.setNombres(rs.getString(2));
                cliente.setApPaterno(rs.getString(3));
                cliente.setApMaterno(rs.getString(4));
                cliente.setDni(rs.getString(5));
                cliente.setTelefono(rs.getString(6));
                cliente.setDireccion(rs.getString(7));
                cliente.setEmailLaboral(rs.getString(8));
                cliente.setEmailPersonal(rs.getString(9));
                cliente.setSexo(rs.getString(10));
                cliente.setFechaNacimiento(rs.getTimestamp(11));
                cliente.setImagen(rs.getString(12));
                cliente.setUsuario(dUsuario.obtenerPorId(rs.getLong(13)));
                cliente.setNroRecTotal(rs.getLong(14));
                cliente.setNroRecAceptados(rs.getLong(15));
                cliente.setNroRecDenegados(rs.getLong(16));
                cliente.setNroServicios(rs.getLong(17));
                cliente.setFechaRegistro(rs.getTimestamp(18));
                cliente.setEstado(rs.getBoolean(19));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return cliente;
    }

    public static eCliente obtenerPorIdUser(Long id) throws Exception {
        eCliente cliente = new eCliente();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM CLIENTE WHERE USUARIO = " + id;
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getLong(1));
                cliente.setNombres(rs.getString(2));
                cliente.setApPaterno(rs.getString(3));
                cliente.setApMaterno(rs.getString(4));
                cliente.setDni(rs.getString(5));
                cliente.setTelefono(rs.getString(6));
                cliente.setDireccion(rs.getString(7));
                cliente.setEmailLaboral(rs.getString(8));
                cliente.setEmailPersonal(rs.getString(9));
                cliente.setSexo(rs.getString(10));
                cliente.setFechaNacimiento(rs.getTimestamp(11));
                cliente.setImagen(rs.getString(12));
                cliente.setUsuario(dUsuario.obtenerPorId(rs.getLong(13)));
                cliente.setNroRecTotal(rs.getLong(14));
                cliente.setNroRecAceptados(rs.getLong(15));
                cliente.setNroRecDenegados(rs.getLong(16));
                cliente.setNroServicios(rs.getLong(17));
                cliente.setFechaRegistro(rs.getTimestamp(18));
                cliente.setEstado(rs.getBoolean(19));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return cliente;
    }

    public static List<eCliente> obtenerTodos() throws Exception {
        List<eCliente> lista = new ArrayList<eCliente>();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM CLIENTE";
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                eCliente cliente = new eCliente();
                cliente.setId(rs.getLong(1));
                cliente.setNombres(rs.getString(2));
                cliente.setApPaterno(rs.getString(3));
                cliente.setApMaterno(rs.getString(4));
                cliente.setDni(rs.getString(5));
                cliente.setTelefono(rs.getString(6));
                cliente.setDireccion(rs.getString(7));
                cliente.setEmailLaboral(rs.getString(8));
                cliente.setEmailPersonal(rs.getString(9));
                cliente.setSexo(rs.getString(10));
                cliente.setFechaNacimiento(rs.getTimestamp(11));
                cliente.setImagen(rs.getString(12));
                cliente.setUsuario(dUsuario.obtenerPorId(rs.getLong(13)));
                cliente.setNroRecTotal(rs.getLong(14));
                cliente.setNroRecAceptados(rs.getLong(15));
                cliente.setNroRecDenegados(rs.getLong(16));
                cliente.setNroServicios(rs.getLong(17));
                cliente.setFechaRegistro(rs.getTimestamp(18));
                cliente.setEstado(rs.getBoolean(19));
                lista.add(cliente);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return lista;
    }

    public static List<eCliente> obtenerCliente(eCliente filtro) throws Exception {
        List<eCliente> lista = new ArrayList<eCliente>();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM CLIENTE WHERE ID = ID";
        if (filtro.getId() != null && !filtro.getId().equals(0L)) {
            query += " AND ID = " + filtro.getId();
        } else {
            if (filtro.getDni() != null && !filtro.getDni().equals("")) {
                query += " AND DNI = '" + filtro.getDni().toUpperCase() + "'";
            }
            if (filtro.getEstado() != null) {
                if (filtro.getEstado()) {
                    query += " AND ESTADO = " + 1;
                } else {
                    query += " AND ESTADO = " + 0;
                }
            }
        }
        query += " ORDER BY ID DESC";
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                eCliente cliente = new eCliente();
                cliente.setId(rs.getLong(1));
                cliente.setNombres(rs.getString(2));
                cliente.setApPaterno(rs.getString(3));
                cliente.setApMaterno(rs.getString(4));
                cliente.setDni(rs.getString(5));
                cliente.setTelefono(rs.getString(6));
                cliente.setDireccion(rs.getString(7));
                cliente.setEmailLaboral(rs.getString(8));
                cliente.setEmailPersonal(rs.getString(9));
                cliente.setSexo(rs.getString(10));
                cliente.setFechaNacimiento(rs.getTimestamp(11));
                cliente.setImagen(rs.getString(12));
                cliente.setUsuario(dUsuario.obtenerPorId(rs.getLong(13)));
                cliente.setNroRecTotal(rs.getLong(14));
                cliente.setNroRecAceptados(rs.getLong(15));
                cliente.setNroRecDenegados(rs.getLong(16));
                cliente.setNroServicios(rs.getLong(17));
                cliente.setFechaRegistro(rs.getTimestamp(18));
                cliente.setEstado(rs.getBoolean(19));
                lista.add(cliente);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return lista;
    }

    public static boolean guardar(eCliente cliente) throws Exception {
        boolean retorno = true;
        Connection cnx = Conexion.getConexion();
        String query = "INSERT INTO CLIENTE VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        try {
            PreparedStatement ps = cnx.prepareStatement(query);
            ps.setLong(1, cliente.getId());
            ps.setString(2, cliente.getNombres().toUpperCase());
            ps.setString(3, cliente.getApPaterno().toUpperCase());
            ps.setString(4, cliente.getApMaterno().toUpperCase());
            ps.setString(5, cliente.getDni().toUpperCase());
            ps.setString(6, cliente.getTelefono().toUpperCase());
            ps.setString(7, cliente.getDireccion().toUpperCase());
            ps.setString(8, cliente.getEmailLaboral().toUpperCase());
            ps.setString(9, cliente.getEmailPersonal().toUpperCase());
            ps.setString(10, cliente.getSexo().toUpperCase());
            ps.setTimestamp(11, cliente.getFechaNacimiento());
            ps.setString(12, cliente.getImagen().toUpperCase());
            ps.setLong(13, cliente.getUsuario().getId());
            ps.setLong(14, cliente.getNroRecTotal());
            ps.setLong(15, cliente.getNroRecAceptados());
            ps.setLong(16, cliente.getNroRecDenegados());
            ps.setLong(17, cliente.getNroServicios());
            ps.setTimestamp(18, cliente.getFechaRegistro());
            ps.setBoolean(19, cliente.getEstado());
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
            retorno = false;
        } finally {
            cnx.close();
        }

        return retorno;
    }

    public static boolean actualizar(eCliente cliente) throws Exception {
        boolean retorno = true;
        Connection cnx = Conexion.getConexion();
        String query = "UPDATE CLIENTE SET NOMBRES = ?, AP_PATERNO = ?, AP_MATERNO = ?, DNI = ?, TELEFONO = ?, DIRECCION = ?, EMAIL_LABORAL = ?, ";
        query += "EMAIL_PERSONAL = ?, SEXO = ?, FECHA_NACIMIENTO = ?, IMAGEN = ?, USUARIO = ?, NRO_REC_TOTAL = ?, NRO_REC_ACEPTADOS = ?, ";
        query += "NRO_REC_DENEGADOS = ?, NRO_SERVICIOS = ?, ESTADO = ? WHERE ID = ?";
        try {
            PreparedStatement ps = cnx.prepareStatement(query);
            ps.setString(1, cliente.getNombres().toUpperCase());
            ps.setString(2, cliente.getApPaterno().toUpperCase());
            ps.setString(3, cliente.getApMaterno().toUpperCase());
            ps.setString(4, cliente.getDni().toUpperCase());
            ps.setString(5, cliente.getTelefono().toUpperCase());
            ps.setString(6, cliente.getDireccion().toUpperCase());
            ps.setString(7, cliente.getEmailLaboral().toUpperCase());
            ps.setString(8, cliente.getEmailPersonal().toUpperCase());
            ps.setString(9, cliente.getSexo().toUpperCase());
            ps.setTimestamp(10, cliente.getFechaNacimiento());
            ps.setString(11, cliente.getImagen());
            ps.setLong(12, cliente.getUsuario().getId());
            ps.setLong(13, cliente.getNroRecTotal());
            ps.setLong(14, cliente.getNroRecAceptados());
            ps.setLong(15, cliente.getNroRecDenegados());
            ps.setLong(16, cliente.getNroServicios());
            ps.setBoolean(17, cliente.getEstado());
            ps.setLong(18, cliente.getId());
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
            retorno = false;
        } finally {
            cnx.close();
        }

        return retorno;
    }
}
